#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
    //宏 --- 很关键：QT中如果要让某一个类能够使用信号和槽，也就是可以在类中定义信号和槽函数，则必须要在类最开始的地方写下 --- Q_OBJECT这个宏
    //属于QT中的硬性规定了！

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    // Qt中也允许自定义信号
    // 自定义槽函数非常关键，开发中大部分情况都是需要自定义槽函数的
    // 槽函数就是用户触发某个操作之后，要进行的业务逻辑！
    // 自定义信号就比较少见，信号对应到用户的某一个操作！
    // 所谓的Qt的信号，本质上也就是一个“函数”

    //Qt5及其更高版本中，槽函数和普通成员函数之间已经没有啥差别了，但是，信号则是一类非常特殊的函数
    //程序员只要写出函数声明，并且告诉Qt，这是一个“信号”即可signal标识 --- Qt自己的关键字
    //这个函数的定义，是Qt在编译过程中，自动生成的 --- 自动生成的过程，程序员无法干预

    //作为信号函数，这个函数的返回值必须是void！参数没有限制，也可以支持重载！

signals:
    //void mySignal(const QString& text1, const QString& text2);//有了信号还不够，我们还需要将信号和槽关联起来！
    void mySignal(int text1);

public:
    void handleMySignal(const QString& text1);//参数类型一定要一致，个数如果不一致也可以，不一致的时候，要求信号的参数要比槽的参数个数要更多！！！


    //自定义信号和槽其实是可以带参数的！（内置的当然也可以）
    //当信号带有参数的时候，槽的参数必须和信号的参数一致！
    //此时发射信号的时候，就可以给信号函数传递实参，与之对应的这个参数就会被传递到对应的槽函数中
    //此时就可以起到信号给槽参数的效果

    //传参可以起到复用代码的效果
    //有多个逻辑，逻辑上整体一致，但是涉及到的数据不同
    //就可以通过 函数--参数 来复用代码，并且在不同的场景中传入不同的参数即可！

    //信号函数的参数个数，少于槽函数的参数个数，此时代码无法编译通过
    //直观的思考，应该是要求信号的参数个数和槽的参数个数严格一致啊？
    //此处为什么允许信号的参数比槽的参数多呢？
    //我们要清楚：这里的信号和槽的绑定并不是一对一的，换句话数，一个槽函数有可能会绑定多个信号，如果我们严格要求参数个数一致，就意味着信号绑定到槽的要求就变高了
    //导致有些信号和槽就绑定不到一起，一个槽要被多个信号绑定，就只有一个参数的信号能和槽绑定到一起！

    //我们信号和槽的参数类型如果不匹配，是不行的，因为这里有一个参数传递的过程！

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
